package com.example.idea.utils;

/**
 * API响应结果封装类。
 */
public class Result<T> {
    private int code; // 状态码
    private String message; // 提示信息
    private T data; // 数据

    // 私有构造函数，防止直接实例化
    private Result() {}

    public static Result failure(String result) {
        return Result.error(500, result);
    }

    /**
     * 定义不同响应状态的枚举。
     */
    public enum Status {
        SUCCESS(200, "成功"),
        UNAUTHORIZED(401, "未授权，认证失败或未提供"),
        NOT_FOUND(404, "请求的资源不存在"),
        INTERNAL_SERVER_ERROR(500, "服务器内部错误");

        private final int code;
        private final String message;

        Status(int code, String message) {
            this.code = code;
            this.message = message;
        }

        public int getCode() {
            return code;
        }

        public String getMessage() {
            return message;
        }
    }

    /**
     * 创建一个成功的Response。
     *
     * @param data 返回的数据
     * @param <T>  数据类型
     * @return 成功的Result对象
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(Status.SUCCESS.getCode());
        result.setMessage(Status.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }

    /**
     * 创建一个带有指定状态的Response。
     *
     * @param status 响应状态
     * @param <T>    数据类型
     * @return 指定状态的Result对象
     */
    public static <T> Result<T> of(Status status) {
        Result<T> result = new Result<>();
        result.setCode(status.getCode());
        result.setMessage(status.getMessage());
        return result;
    }

    /**
     * 创建一个带有指定状态和数据的Response。
     *
     * @param status 响应状态
     * @param data   返回的数据
     * @param <T>    数据类型
     * @return 指定状态的Result对象
     */
    public static <T> Result<T> of(Status status, T data) {
        Result<T> result = of(status);
        result.setData(data);
        return result;
    }

    /**
     * 创建一个带有自定义消息的错误Response。
     *
     * @param code    错误码
     * @param message 错误信息
     * @param <T>     数据类型
     * @return 自定义错误的Result对象
     */
    public static <T> Result<T> error(int code, String message) {
        Result<T> result = new Result<>();
        result.setCode(code);
        result.setMessage(message);
        return result;
    }

    // Getter 和 Setter 方法

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    // 可选：添加更多辅助方法，如自定义异常处理等
}